# 公司：安徽银杰
# 作者：李伟
"""
0、在excel表格里把数据库断言的：
   - 同样用json格式表示： {"sql表达式":"预期结果"}
1、先读取数据出来-- 反序列化 转化字典 ： {"select count(*) from tz_order where order_number = '#orderNumbers#'":1,
"select status from tz_order where order_number = '#orderNumbers#'":1}
2、for循环得到key【sql】 和value【预期数据库查询结果】
3、替换一下sql里的占位符
4、调用数据库封装的方法 执行查询语句 得到数据库查询结果
5、把预期结果和查询结果 断言
6、最后加上日志和异常捕获 + 判空处理。
7、支付结果状态查询。

"""
# import json
# from tools.handle_replace import replace_mark
# from tools.handle_mysql import HandleMysql
# from data.my_db import my_db

# assert_sql = """{"select count(*) from tz_order where order_number = '#orderNumbers#'":1,
# "select status from tz_order where order_number = '#orderNumbers#'":1}"""
#
# # 第一步：反序列化 转化字典
# asset_sql = json.loads(assert_sql)
# # 第二步： for循环得到key【sql】 和value【预期数据库查询结果】
# for k,v in asset_sql.items():
#     # 第三步： 替换一下sql里的占位符
#     k = replace_mark(k)
#     # 第四步：调用数据库封装的方法 执行查询语句 得到数据库查询结果
#     sql_result = HandleMysql(**my_db).quey_data(k) # 数据库查询的结果 {'status': 2}
#     # 第五步：把预期结果和查询结果 断言 实际结果 == 预期结果
#     for i in sql_result.values(): # 因为数据库结果的key不固定的 不能通过key取值value .values获取得到实际结果
#         assert i == v
#

"""
函数封装步骤：
1、功能代码写出来
2、def封装
3、参数化： 变化的数据定义为形参
4、返回值： 判断函数是否有数据需要给调用的人使用
   - 因为是用来做断言的  不需要设置返回值

封装的函数的优化：
1、记录日志： 方便问题定位 看到执行过程 == 但凡print看结果 或者debug看结果的地方都记录日志
2、因为有些用例可能没有在用例没有头部 参数 读取为空
 - 如果没有提取表达式 读出来的就是None  不能做反序列化。
3、断言失败了，异常捕获：如果断言失败了，记录error日志，然后raise 异常错误 用例失败。

"""

import json
import allure
from tools.handle_replace import replace_mark
from tools.handle_mysql import HandleMysql
from data.my_db import my_db
from loguru import logger

@allure.step("数据库的断言")
def db_assert(assert_sql):
    if assert_sql is None:  # 判空处理
        return
    logger.info("----------------------开始数据库断言！-----------------")
    # 第一步：反序列化 转化字典
    asset_sql = json.loads(assert_sql)
    logger.info(f"数据库断言的表达式是：{asset_sql}")
    # 第二步： for循环得到key【sql】 和value【预期数据库查询结果】
    for k,v in asset_sql.items():
        # 第三步： 替换一下sql里的占位符
        k = replace_mark(k)
        # 第四步：调用数据库封装的方法 执行查询语句 得到数据库查询结果
        sql_result = HandleMysql(**my_db).quey_data(k) # 数据库查询的结果 {'status': 2}
        # 第五步：把预期结果和查询结果 断言 实际结果 == 预期结果
        for i in sql_result.values(): # 因为数据库结果的key不固定的 不能通过key取值value .values获取得到实际结果
            logger.info(f"数据库的实际结果是：{i}")
            logger.info(f"数据库的预期结果是：{v}")
            try:
                assert i == v
                logger.info("数据库断言成功！")
            except AssertionError as e:
                logger.error("数据库断言失败！")
                raise e

if __name__ == '__main__':
    assert_sql = """{"select count(*) from tz_order where order_number = '#orderNumbers#'":1, 
    "select status from tz_order where order_number = '#orderNumbers#'":1}"""
    db_assert(assert_sql)

